#include "PatriciaNodo.h"

PatriciaNodo::PatriciaNodo()
{
	clave = "";
	padre = NULL;
    vaciarHijos();
}

PatriciaNodo::PatriciaNodo( PatriciaNodo* p, const string& s )
{
	clave = s;
	padre = p;
	vaciarHijos();
}

PatriciaNodo::PatriciaNodo( const string& s )
{
	clave = s;
	padre = NULL;
	vaciarHijos();
}

PatriciaNodo::PatriciaNodo( const PatriciaNodo& nod )
{
	_copiar(nod);
}

PatriciaNodo::~PatriciaNodo()
{
}


const string& PatriciaNodo::getClave() const
{
	return clave;
}

bool PatriciaNodo::setClave( const string& s )
{
	clave = s;
	return true;
}

PatriciaNodo* PatriciaNodo::getPatriciaNodoLetra( const int x ) const
{
	return siguientes[x];
}

void PatriciaNodo::setPatriciaNodoLetra( PatriciaNodo* nod, const int x )
{
	//si agrego un siguiente
	if( siguientes[x] == NULL && nod != NULL )
	{
		_cantidadHijos++;
	}
	//si saco un siguiente
	else if( siguientes[x] != NULL && nod == NULL )
	{
		_cantidadHijos--;
	}
	
	siguientes[x] = nod;
}

PatriciaNodo* PatriciaNodo::getPatriciaNodoPadre() const
{
	return padre;
}

void PatriciaNodo::setPatriciaNodoPadre( PatriciaNodo* nod )
{
	padre = nod;
}

bool PatriciaNodo::vaciarHijos()
{
	for (int i = 0; i < LETRAS; i++)
		siguientes[i] = NULL;
		
	_cantidadHijos = 0;
	
	return true;
}

bool PatriciaNodo::tieneHijos() const
{
	return _cantidadHijos > 0;
}

int PatriciaNodo::cantidadHijos() const
{
	return _cantidadHijos;
}

bool PatriciaNodo::operator==(const PatriciaNodo& nod) const
{
	bool t = clave == nod.clave;
	
	for (int i = 0; i < LETRAS && t; i++)
	{
		if( siguientes[i] != NULL && nod.siguientes[i] != NULL )
		{
			t = t && ( *(siguientes[i]) == *(nod.siguientes[i]) );
		}
		else if(
			siguientes[i] == NULL && nod.siguientes[i] != NULL
			|| siguientes[i] != NULL && nod.siguientes[i] == NULL
		){
			return false;
		}
	}
	 
	return t;
}

bool PatriciaNodo::operator!=(const PatriciaNodo& nod) const
{
	return !(*this==nod);
}

PatriciaNodo& PatriciaNodo::operator=(const PatriciaNodo& nod)
{
	if(*this != nod)
	{
		vaciarHijos();
		_copiar(nod);
	}
	
	return *this;
}

void PatriciaNodo::_copiar( const PatriciaNodo& nod )
{	
	clave = nod.clave;
	padre = nod.padre;
	
	for (int i = 0; i < LETRAS; i++)
		siguientes[i] = nod.getPatriciaNodoLetra(i);
}

ostream& operator<<( ostream& os, const PatriciaNodo& nod )
{
	if( nod.clave != "" )
		os << nod.clave << endl;
	
	for( int i = 0; i < nod.LETRAS; i++)
	{
		if( nod.siguientes[i] != NULL )
		{
			os << "[" << nod.clave << "] ";
			os << *(nod.siguientes[i]);
			
			if( !nod.tieneHijos() )
				os << endl;
		}
	}
	
	return os;
}
